package com.jabm.cmaq.dao;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.springframework.orm.hibernate3.HibernateTemplate;

/**
 * Clase encargada de implementar las operaciones CRUD de bbdd. Copyright:
 * Copyright (c) 2014 Company:
 * 
 * @author jabastias
 * @version 1.0
 */
@SuppressWarnings("unchecked")
public class BaseDAO<T, PK extends Serializable> {

	/**
	 * Clase engargada de gestionar las operciones CRUD en bbdd. Propia de
	 * hibernate.
	 */
	private HibernateTemplate hibernateTemplate;

	/**
	 * Atributo encargado de indicar genericamente la clase a tratar.
	 */
	private Class<T> claseEntidad = (Class<T>) ((ParameterizedType) getClass()
			.getGenericSuperclass()).getActualTypeArguments()[0];;

	/**
	 * Operación de insercción en bbdd.
	 * 
	 * @param t
	 */
	public void insertar(T t) {
		hibernateTemplate.save(t);

	}

	/**
	 * Operación de modificación en bbdd.
	 * 
	 * @param t
	 */
	public void modificar(T t) {
		hibernateTemplate.merge(t);

	}

	/**
	 * Operación de borrado en bbdd.
	 * 
	 * @param t
	 */
	public void borrar(T t) {
		hibernateTemplate.delete(t);

	}

	/**
	 * Operacion de busqueda
	 * 
	 * @param id
	 * @return T entidad encontrada.
	 */
	public T buscar(int id) {

		return (T) hibernateTemplate.get(claseEntidad, id);
	}

	/**
	 * Operación encargada de listar todos los registros de una tabla.
	 * 
	 * @return
	 */
	public List<T> listarTodos() {

		List<T> list = hibernateTemplate.find("from " + claseEntidad.getName());

		return list;

	}
	
	/**
	 * Operación encargada de listar todos los registros de una tabla.
	 * 
	 * @return
	 */
	public List<T> filtrar(String sql) {

		List<T> list = hibernateTemplate.find(sql);

		return list;

	}

	/**
	 * Devuelve valor del atributo 'hibernateTemplate'.
	 * 
	 * @return valor del atributo 'hibernateTemplate'
	 */
	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	/**
	 * Establece valor del atributo 'hibernateTemplate'.
	 * 
	 * @param hibernateTemplate
	 *            valor del atributo 'hibernateTemplate'
	 */
	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}

	/**
	 * Devuelve valor del atributo 'claseEntidad'.
	 * 
	 * @return valor del atributo 'claseEntidad'
	 */
	public Class<T> getClaseEntidad() {
		return claseEntidad;
	}

	/**
	 * Establece valor del atributo 'claseEntidad'.
	 * 
	 * @param claseEntidad
	 *            valor del atributo 'claseEntidad'
	 */
	public void setClaseEntidad(Class<T> claseEntidad) {
		this.claseEntidad = claseEntidad;
	}

}
